
// 引入 dotenv 包来加载 .env 文件中的环境变量
require('dotenv').config();

// 导入 express 模块
const express = require('express')

// 创建 express 的服务器实例
const app = express()
const path = require('path')
const fs = require('fs')

const joi = require('joi')
// const server = require('./server')

// 中间件用于规范化URL
app.use((req, res, next) => {
	// 使用正则表达式替换多余的斜杠
	const normalizedPath = req.path.replace(/\/+/g, '/');
	// console.log(normalizedPath);
	// 更新请求的路径
	req.url = normalizedPath;
  
	next();
  });

// 设置 public 文件夹作为静态资源目录
app.use(express.static(path.join(__dirname, 'dist')));

// 静态可访问文件
app.use('/s_static', express.static(path.join(__dirname, 'static')))

// 上传的图片
app.use('/api', express.static(path.join(__dirname, 'matter/img')))
app.use('/api', express.static(path.join(__dirname, 'uploads')))




// 处理数据庞大的时候
const bodyParser = require('body-parser');
app.use(bodyParser.json({
	limit: '5000mb'
}));
app.use(bodyParser.urlencoded({
	limit: '5000mb',
	extended: true
}));

// 响应数据的中间件
app.use(function (req, res, next) {
	// 给响应对象添加一个自定义的 cc 方法  
	res.cc = function (err, status = 500) {
		// 确保状态码是三位数  
		if (typeof status !== 'number' || status < 100 || status > 599) {
			status = 500; // 默认的服务器内部错误  
		}

		// 如果 err 是 Error 对象，则使用其 message，否则将 err 作为 message  
		const message = err instanceof Error ? err.message : err;

		// 发送带有状态和消息的响应  
		res.status(status).send({
			status: status,
			message: message
		});
	};

	// 继续执行下一个中间件  
	next();
});



/* 
@params:路由注册
*/
// 导入 cors 中间件
const cors = require('cors')
// 将 cors 注册为全局中间件 解决跨域问题
app.use(cors())
app.use(express.json())
app.use(express.urlencoded({
	extended: false
}))

// 路由注册图片上传
const flie = require('./router/file')
app.use('/api', flie)


// 导入配置文件
const JWTconfig = require('./config')

// 解析 token 的中间件
const expressJWT = require('express-jwt')
const jwtAuth = expressJWT({
	secret: JWTconfig.jwtSecretKey
})
// 使用 .unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行 Token 的身份认证
// app.use(expressJWT({
// 	secret: JWTconfig.jwtSecretKey
// }).unless({
// 	path: [/^\/api\//]
// }))

//自动刷新token
const refreshToken = require('./router/refresh_token')
app.use('/api', refreshToken)

// 导入并注册用户路由模块
const userRouter = require('./router/user')
app.use('/api', userRouter)

// 商品管理
const goodsRouter = require('./router/goods')
app.use('/my', jwtAuth, goodsRouter)

// 订单管理
const ordersRouter = require('./router/orders')
app.use('/my', jwtAuth, ordersRouter)

// 订单管理
const exchangeRouter = require('./router/wx_exchange')
app.use('/my', jwtAuth, exchangeRouter)

// 地址查询
const addressRouter = require('./router/wx_address')
app.use('/my', jwtAuth, addressRouter)





// 微信小程序
const getOpenidRouter = require('./router/wx_getOpenid')
app.use('/api', getOpenidRouter)

// 用户自动登录
const wxLoginRouter = require('./router/wx_login')
app.use('/api', wxLoginRouter)

// 一个小测试
const wxUserRouter = require('./router/wx_user')
app.use('/my', jwtAuth, wxUserRouter)


/* 
 *删除文件
 */

app.post('/remove_update', (req, res) => {
	let wenjian = req.body.wenjian
	fs.unlink(path.join(__dirname, './uphloads', wenjian), (error) => {
		if (error) {
			console.log(error);
			res.send({
				status: 404,
				message: '删除不成功'
			})
			return false
		}
		res.send({
			status: 200,
			message: '删除成功'
		})
	})
})



// 错误中间件ex
app.use(function (err, req, res, next) {
	console.log(req.headers, err)
	if (err.message === "No authorization token was found") {
		return res.cc('身份认证失败！请重新登录')
	}
	// 捕获身份认证失败的错误
	if (err.name === 'UnauthorizedError') {
		// 返回 401 Unauthorized 状态码和错误信息
		return res.status(401).json({
			message: '身份认证失败！请重新登录！'
		});
	}

	// 数据验证失败
	if (err instanceof joi.ValidationError) {
		// 提取错误信息
		const errorMessage = err.details[0].message;
		// 返回 400 Bad Request 状态码和错误信息
		return res.status(400).json({
			message: errorMessage
		});
	}

	// 文件大小限制错误
	if (err.code === 'LIMIT_FILE_SIZE') {
		return res.status(413).json({ message: `文件尺寸太大` });
	}

	// 未知错误
	// 返回 500 Internal Server Error 状态码和错误信息
	return res.status(500).json({
		message: 'An unknown error occurred!'
	});
});


// 404 处理
// app.use((req, res, next) => {
// 	res.status(404).json({ message: 'Not found 404', status: 400 });
// });

// 确保所有未匹配到的路由都返回index.html  
app.get('*', (req, res) => {
	res.sendFile(path.resolve(__dirname, 'dist', 'index.html'));
});

// const https = require('https')
// var port = process.env.PORT || process.env.VCAP_APP_PORT || 3007;
// // // 证书
// var options = {

//     key: fs.readFileSync('certificates/rookzc.site.key'),

//     cert: fs.readFileSync('certificates/rookzc.site_bundle.crt')

// };
// https.createServer(options, app).listen(port);
// 调用 app.listen 方法，指定端口号并启动web服务器
const port = process.env.SERVER_PORT || 3007;
app.listen(port, function () {
	console.log(`api server running at PORT:${port}********************************************************`)
})